import tkinter as tk  
from tkinter import filedialog   
import re,csv,os
# 初始化 创建正则表达式，初始化全局变量
role=re.compile('出生日期:(\d{4}-\d{2}-\d{2}),')
print(role.pattern)
file_path=None
get_DateOfBirth_button=None
save_path=None

def FindDateOfBirth(file_path):
    # 尝试使用UTF-8编码打开文件  
    try:  
        with open(file_path, 'r', encoding='utf-8') as file:  
            return file.readlines()  
    except UnicodeDecodeError:  
        # 如果UTF-8编码打开文件失败，尝试使用GBK编码  
        try:  
            with open(file_path, 'r', encoding='gbk') as file:  
                return file.readlines()  
        except UnicodeDecodeError:  
            # 如果GBK也失败，抛出异常  
            raise ValueError(f"致命错误:文件既不是UTF-8编码也不是GBK编码!!!")  
# 弹出文件选择对话框 
def select_file():   
    # askopenfilename 返回选择的文件路径  
    global file_path
    file_path= filedialog.askopenfilename(filetypes=[("csv文件", "*.csv"),("TXT文本文件", "*.txt")])  
    # 检查用户是否选择了文件  
    if file_path:  
        # 更新标签以显示文件路径  
        file_label.config(text=f"您选择的文件是: {file_path}")  
        # 更新按钮状态
        update_button_state()  
def update_button_state():  
    # 检查file_path是否为None，并相应地更新按钮状态  
    if file_path:  
        get_DateOfBirth_button.config(state='normal', text="提取出生日期")  
    else:  
        get_DateOfBirth_button.config(state='disabled', text="请先选择文件")  
def get_DateOfBirth():
    global save_path
    save_path = filedialog.asksaveasfilename(defaultextension=".txt",  
                                            filetypes=[("TXT文本文件", "*.txt"),("csv文件", "*.csv")]) 
    lines = FindDateOfBirth(file_path)
    # 打开（或创建）文件并写入数据  
    with open(save_path, 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)  
        # 写入标题行
        writer.writerow({"正则提取"})  
        lineNum=0
        # 循环数据保存文件
        for line in lines:
            lineNum+=1 
            match=role.search(line)
            if(match and len(match.groups())>0):
                writer.writerow({match.group(1)})
            else:
                print(f"警告:第{lineNum}行没有找到预期的匹配字符串")
        # 获取当前工作目录  
        current_working_directory = os.getcwd()
        # 构建完全路径  
        full_path = os.path.join(current_working_directory, save_path) 
         # 更新标签以显示文件路径  
        file_label.config(text=f"成功!出生日期已转存至{full_path}")  
# 修改正则表达式
def change_role():
    global role
    role=re.compile(entry.get())
    entry.delete(0, tk.END) 
    entry.insert(0,role.pattern)

# 复原正则表达式
def reset_role():
    entry.delete(0, tk.END) 
    entry.insert(0,role.pattern)


# 创建主窗口  
root = tk.Tk()  
root.title("出生日期提取")  
# 设置窗口大小（可选）  
root.geometry("300x100")  

# 创建一个Frame作为容器  
frame = tk.Frame(root)  
frame.pack(expand=True, fill=tk.BOTH, pady=10)  # 设置Frame的填充和扩展属性 

# 创建一个标签用于显示文件信息  
file_label = tk.Label(frame, text="请选择一个文件")  
file_label.grid(row=0, column=0,columnspan=4)

# 创建一个按钮选择文件
select_button = tk.Button(frame, text="选择文件", command=select_file)  
select_button.grid(row=1, column=0, columnspan=2)

# 创建一个按钮提取匹配的项
get_DateOfBirth_button = tk.Button(frame, text="提取每行匹配的项", command=get_DateOfBirth)  
get_DateOfBirth_button.grid(row=1,column=1,sticky='e',columnspan=2)
  
# 创建一个Label组件来显示提示字符  
prompt_label = tk.Label(frame, text="当前正则:")  
prompt_label.grid(row=2, column=0, padx=(0, 2))  
  
# 创建一个输入框  
entry = tk.Entry(frame)  
entry.insert(0,role.pattern)
entry.grid(row=2, column=1, padx=(0, 2))  
  
# 创建一个按钮  
button1 = tk.Button(frame, text="修改",command=change_role)  
button1.grid(row=2, column=2) 
# 创建一个按钮  
button2 = tk.Button(frame, text="复位",command=reset_role)  
button2.grid(row=2, column=3)  
  
# 通过设置Frame的columnconfigure和rowconfigure，可以实现Label、Entry和Button的居中显示  
frame.columnconfigure(0, weight=1)  
frame.columnconfigure(1, weight=5)  # 让Entry占据更多的空间  
frame.columnconfigure(2, weight=1)  # 让Button占据一定的空间  
frame.columnconfigure(3, weight=1)  # 让Button占据一定的空间  
frame.rowconfigure(0, weight=1)  
# 先更新按钮状态设置禁用
update_button_state()  
# 进入主循环，等待用户操作  
root.mainloop()